package ywpt.web.common;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.util.JSONUtils;

public class JsonUtil {
	/** 
	* 从一个JSON 对象字符格式中得到一个java对象，形如： 
	* {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...}}
	 * @param object 
	* @param clazz 
	* @return 
	*/ 
	@SuppressWarnings("unchecked")
	public static Object getDTO(String jsonString, Class clazz){ 
	JSONObject jsonObject = null; 
	try{ 
	setDataFormat2JAVA(); 
	jsonObject = JSONObject.fromObject(jsonString); 
	}catch(Exception e){ 
	e.printStackTrace(); 
	} 
	return JSONObject.toBean(jsonObject, clazz); 
	} 

	/** 
	* 从一个JSON 对象字符格式中得到一个java对象，其中beansList是一类的集合，形如： 
	* {"id" : idValue, "name" : nameValue, "aBean" : {"aBeanId" : aBeanIdValue, ...},
	 * beansList:[{}, {}, ...]} 
	* @param jsonString 
	* @param clazz 
	* @param map 集合属性的类型 (key : 集合属性名, value : 集合属性类型class) eg: ("beansList" : Bean.class)
	 * @return 
	*/ 
	@SuppressWarnings("unchecked")
	public static Object getDTO(String jsonString, Class clazz, Map map){ 
	JSONObject jsonObject = null; 
	try{ 
	setDataFormat2JAVA(); 
	jsonObject = JSONObject.fromObject(jsonString); 
	}catch(Exception e){ 
	e.printStackTrace(); 
	} 
	return JSONObject.toBean(jsonObject, clazz, map); 
	} 

	/** 
	* 从一个JSON数组得到一个java对象数组，形如： 
	* [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...]
	 * @param object 
	* @param clazz 
	* @return 
	*/ 
	@SuppressWarnings("unchecked")
	public static Object[] getDTOArray(String jsonString, Class clazz){ 
	setDataFormat2JAVA(); 
	JSONArray array = JSONArray.fromObject(jsonString); 
	Object[] obj = new Object[array.size()]; 
	for(int i = 0; i < array.size(); i++){ 
	JSONObject jsonObject = array.getJSONObject(i); 
	obj[i] = JSONObject.toBean(jsonObject, clazz); 
	} 
	return obj; 
	} 

	/** 
	* 从一个JSON数组得到一个java对象数组，形如： 
	* [{"id" : idValue, "name" : nameValue}, {"id" : idValue, "name" : nameValue}, ...]
	 * @param object 
	* @param clazz 
	* @param map 
	* @return 
	*/ 
	@SuppressWarnings("unchecked")
	public static Object[] getDTOArray(String jsonString, Class clazz, Map map){ 
	setDataFormat2JAVA(); 
	JSONArray array = JSONArray.fromObject(jsonString); 
	Object[] obj = new Object[array.size()]; 
	for(int i = 0; i < array.size(); i++){ 
	JSONObject jsonObject = array.getJSONObject(i); 
	obj[i] = JSONObject.toBean(jsonObject, clazz, map); 
	} 
	return obj; 
	} 

	/** 
	* 从一个JSON数组得到一个java对象集合 
	* @param object 
	* @param clazz 
	* @return 
	*/ 
	@SuppressWarnings("unchecked")
	public static List getDTOList(String jsonString, Class clazz){ 
	setDataFormat2JAVA(); 
	JSONArray array = JSONArray.fromObject(jsonString); 
	List list = new ArrayList(); 
	for(Iterator iter = array.iterator(); iter.hasNext();){ 
	JSONObject jsonObject = (JSONObject)iter.next(); 
	list.add(JSONObject.toBean(jsonObject, clazz)); 
	} 
	return list; 
	} 

	/** 
	* 从一个JSON数组得到一个java对象集合，其中对象中包含有集合属性 
	* @param object 
	* @param clazz 
	* @param map 集合属性的类型 
	* @return 
	*/ 
	@SuppressWarnings("unchecked")
	public static List getDTOList(String jsonString, Class clazz, Map map){ 
	setDataFormat2JAVA(); 
	JSONArray array = JSONArray.fromObject(jsonString); 
	List list = new ArrayList(); 
	for(Iterator iter = array.iterator(); iter.hasNext();){ 
	JSONObject jsonObject = (JSONObject)iter.next(); 
	list.add(JSONObject.toBean(jsonObject, clazz, map)); 
	} 
	return list; 
	} 

	/** 
	* 从json HASH表达式中获取一个map，该map支持嵌套功能 
	* 形如：{"id" : "johncon", "name" : "小强"} 
	* 注意commons-collections版本，必须包含org.apache.commons.collections.map.MultiKeyMap 
	* @param object 
	* @return 
	*/ 
	@SuppressWarnings("unchecked")
	public static Map getMapFromJson(String jsonString) { 
	setDataFormat2JAVA(); 
	        JSONObject jsonObject = JSONObject.fromObject(jsonString); 
	        Map map = new HashMap(); 
	        for(Iterator iter = jsonObject.keys(); iter.hasNext();){ 
	            String key = (String)iter.next(); 
	            map.put(key, jsonObject.get(key)); 
	        } 
	        return map; 
	    } 

	/** 
     * 从json数组中得到相应java数组 
     * json形如：["123", "456"] 
     * @param jsonString 
     * @return 
     */ 
    public static Object[] getObjectArrayFromJson(String jsonString) { 
        JSONArray jsonArray = JSONArray.fromObject(jsonString); 
        return jsonArray.toArray(); 
    } 
	
	private static void setDataFormat2JAVA(){ 
		//设定日期转换格式 
		JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"}));
	}
}
